2022 Hunga Tonga Eruption#

Written by Sage Lichtenwalner, Rutgers University, June 3, 2024

Note this activity is still being developed

On January 15, 2022, the Hunga Tonga–Hunga Haʻapai volcano erupted in the southern Pacific Ocean. The ensuing erruption created an undertwater tsunami that crossed the entire Pacific Ocean. The explosion was so severe, the eruption also caused the largest ever recored atmospheric shockwave that propagated around the globe.

A number of ocean tidal and underwater pressure gauges around the Pacific ocean detected the tsunami. And atmospheric pressure sensors around the world were also above to detect the pressure waves that resulted from the eruption. The Ocean Observatories Initiative (OOI) is one of many observatories that operates several high-resolution atmospheric and ocean pressure sampling instruments. The OOI includes the Endurance Array off the coast of Oregon in the Northeast Pacific, and the Pioneer NES array in the Mid-Atlantic.

So the question is, did the OOI measure the impact of the volcanic eruption at it’s sites thousands of miles away?

In this notebook, we will demonstrate how to access and plot data from the two coastal OOI arrays, in the Northweast Pacific and off the New England coast, to see if we can detect the eruption’s signature at these locations.

# Install erddapy
# !pip install erddapy
# Notebook Setup
from erddapy import ERDDAP
import pandas as pd
import matplotlib.pyplot as plt
# Setup Erddap connection
server = "https://erddap.dataexplorer.oceanobservatories.org/erddap/"
e = ERDDAP(
    server=server,
    protocol="tabledap",
    response="csv",
)

Detecting a Tsunami with Seafloor Pressure#

First, let’s take a look at the seafloor pressure data at the Endurance Array.

# Load CE04 Bottom Pressure
url_ce04_bot = e.get_download_url(
    dataset_id = "ooi-ce04osbp-lj01c-06-ctdbpo108",
    constraints = {
      "time>=": "2022-01-15",
      "time<=": "2022-01-17",
    }
)
# print(url_ce04_bot)
ce04_bot = pd.read_csv(url_ce04_bot, index_col='time', parse_dates=True, skiprows=[1])
ce04_bot.head()
latitude longitude z sea_water_electrical_conductivity sea_water_electrical_conductivity_qc_agg sea_water_electrical_conductivity_qc_tests mole_concentration_of_dissolved_molecular_oxygen_in_sea_water mole_concentration_of_dissolved_molecular_oxygen_in_sea_water_qc_agg mole_concentration_of_dissolved_molecular_oxygen_in_sea_water_qc_tests moles_of_oxygen_per_unit_mass_in_sea_water ... sea_water_density sea_water_density_qc_agg sea_water_density_qc_tests sea_water_pressure sea_water_pressure_qc_agg sea_water_pressure_qc_tests sea_water_temperature sea_water_temperature_qc_agg sea_water_temperature_qc_tests station
time
2022-01-15 00:00:00+00:00 44.369397 -124.953617 0.0 29.643845 3 NaN 23.730510 2 NaN 19.305701 ... 1026.693798 2 NaN 584.466768 1 NaN 5.013958 1 NaN NaN
2022-01-15 00:01:00+00:00 44.369397 -124.953617 0.0 29.642491 3 NaN 23.806607 2 NaN 19.367407 ... 1026.694675 2 NaN 584.459189 1 NaN 5.011411 1 NaN NaN
2022-01-15 00:02:00+00:00 44.369397 -124.953617 0.0 29.642617 3 NaN 23.963735 2 NaN 19.494897 ... 1026.696396 2 NaN 584.459404 1 NaN 5.009475 1 NaN NaN
2022-01-15 00:03:00+00:00 44.369397 -124.953617 0.0 29.643931 3 NaN 24.095737 2 NaN 19.601942 ... 1026.698133 2 NaN 584.451868 1 NaN 5.008756 1 NaN NaN
2022-01-15 00:04:00+00:00 44.369397 -124.953617 0.0 29.645859 3 NaN 24.141670 2 NaN 19.639027 ... 1026.699672 2 NaN 584.452029 1 NaN 5.008971 1 NaN NaN

5 rows × 25 columns

ce04_bot['sea_water_pressure'].plot()
plt.ylabel('Water Pressure (db)')  
plt.title('Oregon Offshore Cabled Benthic Experiment Package (CE04OSBP)')
Text(0.5, 1.0, 'Oregon Offshore Cabled Benthic Experiment Package (CE04OSBP)')
_images/51f8ea31270573676c06b8c8768360f238e28838d780b0cf5c1fcc0cdb092c9c.png

Quick Quesions

  • What do you think causes the general pattern you see in the pressure dataset?

  • Can you see the impact of the tsunami in the pressure daset? What does it look like?

  • When did the tsunami first reach this station?

To answer this last question, we really need to zoom in on the data a bit more. We could create a new plot with a narrower time range, or we can try using the Plotly library to create an interactive graph.

# !pip install plotly
import plotly.express as px
px.line(x=ce04_bot.index, y=ce04_bot.sea_water_pressure, 
        labels=dict(y='Waer Pressure (db)'),
        title='Oregon Offshore Cabled Benthic Experiment Package (CE04OSBP)')

Calculating Wave Speed#

Now that you have the time the tsunami reached the Endurance Array, you can calculate the phase speed of the tsunami wave.

Phase Speed = Distance between Hunga and Endurance / Time it took to reach Endurance from Hunga

Becuse tsunamis act as shallow water waves in the ocean, you can calculate their expected phase speed using the shallow water wave equation.

C_(phase) = sqrt(g * H)

If we assume the height/depth of the ocean is the average depth of the Pacific Ocean (4,280), how does this estimate of the phase speed compare with what you calculated for the actual tsunami?

Atmospheric Pressure Waves#

One of the interesting impacts of the eruption was the massive atmospheric pressure wave it also caused. Can we see this signal at the OOI arrays?

# Load CE04 Surface Pressure
url_ce04_met = e.get_download_url(
    dataset_id = "ooi-ce04ossm-sbd11-06-metbka000",
    constraints = {
      "time>=": "2022-01-15",
      "time<=": "2022-01-17",
    }
)
# print(url_wave)

ce04_met = pd.read_csv(url_ce04_met, index_col='time', parse_dates=True, skiprows=[1])
ce04_met.head()
latitude longitude z air_pressure air_pressure_qc_agg air_pressure_qc_tests sea_water_electrical_conductivity sea_water_electrical_conductivity_qc_agg sea_water_electrical_conductivity_qc_tests condsrf ... northward_wind northward_wind_qc_agg northward_wind_qc_tests wind_speed wind_speed_qc_agg wind_speed_qc_tests wind10m wind10m_qc_agg wind10m_qc_tests station
time
2022-01-15 00:01:00+00:00 44.364 -124.9402 0.0 1028.180078 2 NaN NaN NaN NaN 3.6059 ... -5.536348 2 NaN NaN 2 NaN NaN 2 0 NaN
2022-01-15 00:02:00+00:00 44.364 -124.9402 0.0 1028.110000 2 NaN NaN NaN NaN 3.6060 ... -5.068840 2 NaN NaN 2 NaN NaN 2 0 NaN
2022-01-15 00:03:00+00:00 44.364 -124.9402 0.0 1027.840000 2 NaN NaN NaN NaN 3.6058 ... -5.704606 2 NaN NaN 2 NaN NaN 2 0 NaN
2022-01-15 00:04:00+00:00 44.364 -124.9402 0.0 1028.319922 2 NaN NaN NaN NaN 3.6056 ... -5.794927 2 NaN NaN 2 NaN NaN 2 0 NaN
2022-01-15 00:05:00+00:00 44.364 -124.9402 0.0 1028.180078 2 NaN NaN NaN NaN 3.6057 ... -6.164684 2 NaN NaN 2 NaN 6.152041 2 0 NaN

5 rows × 103 columns

ce04_met['air_pressure'].plot()
plt.ylabel('Air Pressure (mb)');
plt.title('Oregon Offshore Surface Mooring (CE04OSSM)');
_images/a33be0e63f1eb70455340fcc0d2f83730894eba596b8db7cb658459d99385025.png

Calculating the Atm Wave Speed#

In the air, pressure waves typically travel at the speed of sound, or about 343 m/s.

Calculate the distance between Hunga and this station, and the time it took for the wave to travel, and then compare this with the expected speed.

Combining the plots#

Let’s plot both datasets on one graph to see how the timing of the atmospheric and seawater waves compares with each other.

Note, due to the way pandas handles date ticks, we will resample the datsets to have the same timestaps so we can plot them both on the same graph.

fig,ax1 = plt.subplots()

color = 'tab:red'
ce04_met['air_pressure'].resample('1min').mean().plot(color=color, ax=ax1)
ax1.set_ylabel('Air Pressure (mb)', color=color)
ax1.tick_params(axis='y', labelcolor=color)

ax1b = ax1.twinx()  # instantiate a second axes that shares the same x-axis
color = 'tab:blue'
ce04_bot['sea_water_pressure'].resample('1min').mean().plot(color=color, ax=ax1b)
ax1b.set_ylabel('Water Pressure (db)', color=color)  
ax1b.tick_params(axis='y', labelcolor=color)
_images/8054fc274221c4a41f61dfd065c475e05471d02007509d82f99c46c7d5aaccf7.png

What about the Pioneer Array?#

Let’s take a look at the atmospheric pressure at the Pioneer Array on the US East Coast to see if the impact of teh eruption was measured there.

# Load CE04 Surface Pressure
url_cp01_met = e.get_download_url(
    dataset_id = "ooi-cp01cnsm-sbd11-06-metbka000",
    constraints = {
      "time>=": "2022-01-15",
      "time<=": "2022-01-17",
    }
)
# print(url_wave)

cp01_met = pd.read_csv(url_cp01_met, index_col='time', parse_dates=True, skiprows=[1])
cp01_met.head()
latitude longitude z air_pressure air_pressure_qc_agg air_pressure_qc_tests sea_water_electrical_conductivity sea_water_electrical_conductivity_qc_agg sea_water_electrical_conductivity_qc_tests condsrf ... northward_wind northward_wind_qc_agg northward_wind_qc_tests wind_speed wind_speed_qc_agg wind_speed_qc_tests wind10m wind10m_qc_agg wind10m_qc_tests station
time
2022-01-15 00:00:00+00:00 40.13325 -70.778317 0.0 1000.53 2 NaN 37.595999 1 NaN 3.7596 ... -16.095534 2 NaN NaN 2 NaN NaN 2 NaN NaN
2022-01-15 00:01:00+00:00 40.13325 -70.778317 0.0 1000.53 2 NaN 37.602000 1 NaN 3.7602 ... -17.670770 2 NaN NaN 2 NaN NaN 2 NaN NaN
2022-01-15 00:02:00+00:00 40.13325 -70.778317 0.0 999.36 2 NaN 37.533000 1 NaN 3.7533 ... -16.620215 2 NaN NaN 2 NaN NaN 2 NaN NaN
2022-01-15 00:03:00+00:00 40.13325 -70.778317 0.0 1000.33 2 NaN 37.532001 1 NaN 3.7532 ... -18.881056 2 NaN NaN 2 NaN NaN 2 NaN NaN
2022-01-15 00:04:00+00:00 40.13325 -70.778317 0.0 1000.60 2 NaN 37.548001 1 NaN 3.7548 ... -17.071467 2 NaN NaN 2 NaN NaN 2 NaN NaN

5 rows × 103 columns

cp01_met['air_pressure'].plot()
plt.ylabel('Air Pressure (mb)');
plt.title('Pioneer Array - Central Surface Mooring (CP01CNSM)');
_images/134da4cd96b90a23aa4da86f2d6be17ff321c2684b798d66427e0364cc74751f.png

Based on this data, calculte the speed of the wave that reached the Pioneer Array. How does this compare with the expected speed, whcih shoudl be about the speed of sound.

Note, these will be different, becuase (I think) the wave we observe at teh Pioneer Array is actually the reflection from the anti-pode. If you recalculate the distance from Hunga to the Antipode, and then from there to Pioneer, how does that match?

Graphing all 3 datasets#

fig,(ax1,ax2,ax3) = plt.subplots(3,1, figsize=(10,6), sharex=True)

ce04_bot['sea_water_pressure'].resample('1min').mean().plot(ax=ax1)
ax1.set_ylabel('Water Pressure (db)')  
ax1.set_title('Oregon Offshore Cabled Benthic Experiment Package (CE04OSBP)')

ce04_met['air_pressure'].resample('1min').mean().plot(ax=ax2)
ax2.set_ylabel('Air Pressure (mb)')
ax2.set_title('Oregon Offshore Surface Mooring (CE04OSSM)')

cp01_met['air_pressure'].resample('1min').mean().plot(ax=ax3)
ax3.set_ylabel('Air Pressure (mb)')
ax3.set_title('Pioneer Array - Central Surface Mooring (CP01CNSM)');
_images/27cf4b988290ddfa063f22eba7d9a9c1d20f221427b6173bee179846751125d0.png

Extension Ideas#

  • The Endurance and Pioneer arrays include several atmospheric pressure sensors and underwater tide or pressure gagues. Can you identify other senors that detected the tsunami or shockwave.

  • Based on these addtional sensors, is your estimate of the speed the same?

  • Can you predict when the tsunami would have hit Station Papa? Can you identify the tsunami in the dataset?

  • (advanced) Can you predict when the atmospheric shockwave might have hit Irminger Sea station? Can you identify the shockwave in the dataset?

References#

First a bunch from EOS…

** Definitely start with these. And I highly recommend clicking through to the article on the 2nd one and downloading the movie in the supplemental info.

Finally, here are some posts on Flowing Data, which collects some of the best data visualizations from around the web.